package xjtu.sad.zbsj.template;

import org.springframework.web.bind.annotation.*;
import xjtu.sad.zbsj.common.PageParam;
import xjtu.sad.zbsj.common.Result;
import xjtu.sad.zbsj.dao.template.TemplateDao;

import javax.annotation.Resource;
import java.util.HashSet;
import java.util.Set;

@RestController
@RequestMapping("/template")
public class TemplateAPI {

    @Resource
    private TemplateService templateService;

    @Resource
    private TemplateDao templateDao;

    private final Set<String> pageKindSet = new HashSet<>();

    public TemplateAPI() {
        pageKindSet.add("templateList");
        pageKindSet.add("defaultTemplateList");
        pageKindSet.add("drawList");
    }

    /**
     * 获取当前用户的所有模板信息
     *
     * @param userId    用户id
     * @param pageParam 分页参数
     * @return userId为有效时返回请求该用户创建的模板, 无效时返回错误信息
     */
    @PostMapping("/getTemplateList")
    public Result getTemplateList(@RequestParam Integer userId, @RequestBody PageParam pageParam) {
        UserInfo userInfo = templateDao.getUserInfo(userId);//判断是否有这个用户,并且角色为发布方
        // 判断是否有这个用户
        if (userInfo != null && userInfo.getUserId() != null) {
            // 判断该用户角色是否为发布者或者管理员
            if (userInfo.getRoleId() == 2 || userInfo.getRoleId() == 1) {
                return Result.success(templateService.getTemplateList(userId, pageParam));
            } else {
                return Result.fail(Result.ERR_CODE_BUSINESS, "您无权限进行此操作");
            }
        } else {
            return Result.fail(Result.ERR_CODE_UNREGISTER, "用户信息有误,请检查登录状态");
        }
    }

    /**
     * 获取所有公共模板信息
     *
     * @param pageParam 分页参数
     * @return 返回所有公共模板列表
     */
    @PostMapping("/getDefaultTemplateList")
    public Result getDefaultTemplateList(@RequestBody PageParam pageParam) {
        return Result.success(templateService.getDefaultTemplateList(pageParam));
    }

    /**
     * 获取当前模板的具体信息
     *
     * @param templateId 模板id
     * @return 如果存在该模板则返回该模板信息, 如果不存在返回错误信息
     */
    @GetMapping("/getTemplateInfo")
    public Result getTemplateInfo(@RequestParam Integer templateId) {
        Integer templateCount = templateDao.getTemplateCount(templateId);
        // 根据templateId判断是否存在这个模板
        if (templateCount == 1) {
            return Result.success(templateService.getTemplateInfo(templateId));
        } else {
            return Result.fail(Result.ERR_CODE_BUSINESS, "当前模板不存在");
        }
    }

    /**
     * 新建模板
     *
     * @param template 新建模板信息
     * @return 是否添加成功
     */
    @PostMapping("/addNewTemplate")
    public Result addNewTemplate(@RequestBody Template template) {
        Integer userId = template.getUserId();
        UserInfo userInfo = templateDao.getUserInfo(userId);//判断是否有这个用户,并且角色为发布方
        // 判断是否有这个用户
        if (userInfo != null) {
            // 判断该用户角色是否为发布者或者管理员
            if (userInfo.getRoleId() == 2 || userInfo.getRoleId() == 1) {
                boolean success = templateService.addNewTemplate(template);
                if (success) {
                    return Result.success("添加成功");
                } else {
                    return Result.fail(Result.ERR_CODE_BUSINESS, "添加失败");
                }
            } else {
                return Result.fail(Result.ERR_CODE_BUSINESS, "您无权限进行此操作");
            }
        } else {
            return Result.fail(Result.ERR_CODE_UNREGISTER, "用户信息有误,请检查登录状态");
        }
    }

    /**
     * 修改模板信息
     *
     * @param template 模板信息
     * @return 修改信息是否成功
     */
    @PostMapping("/changeTemplateInfo")
    public Result changeTemplateInfo(@RequestBody Template template) {
        Template templateInfo = templateDao.getTemplateInfo(template.getTemplateId());
        // 判断是否存在这个模板
        if (templateInfo != null) {
            // 判断是否有权限修改此模板
            if (templateInfo.getUserId().equals(template.getUserId())) {
                Integer taskCount = templateDao.getTemplateUseCount(template.getTemplateId());
                if (taskCount > 0) {
                    return Result.fail(Result.ERR_CODE_BUSINESS, "当前模板正在被使用,无法修改");
                }
                // 判断是否修改成功
                boolean success = templateService.changeTemplateInfo(template);
                if (success) {
                    return Result.success("信息修改成功");
                } else {
                    return Result.fail(Result.ERR_CODE_BUSINESS, "信息修改失败");
                }
            } else {
                return Result.fail(Result.ERR_CODE_BUSINESS, "您无权限修改此模板信息");
            }
        } else {
            return Result.fail(Result.ERR_CODE_BUSINESS, "当前模板不存在,无法修改模板信息");
        }
    }

    /**
     * 删除模板
     *
     * @param template 模板信息
     * @return 删除是否成功
     */
    @PostMapping("/deleteTemplate")
    public Result deleteTemplate(@RequestBody Template template) {
        Template templateInfo = templateDao.getTemplateInfo(template.getTemplateId());
        // 判断是否存在这个模板
        if (templateInfo != null) {
            // 判断是否有权限删除此模板
            if (templateInfo.getUserId().equals(template.getUserId())) {
                // 判断是否删除成功
                Integer status = templateService.deleteTemplate(template);
                if (status == 3) {
                    return Result.success("模板删除成功");
                } else if (status == 2) {
                    return Result.fail(Result.ERR_CODE_BUSINESS, "模板删除失败");
                } else {
                    return Result.fail(Result.ERR_CODE_BUSINESS, "该模板已被使用,无法被删除");
                }
            } else {
                return Result.fail(Result.ERR_CODE_BUSINESS, "您无权限修改此模板信息");
            }
        } else {
            return Result.fail(Result.ERR_CODE_BUSINESS, "当前模板不存在,无法修改模板信息");
        }
    }

    /**
     * 修改模板公开状态
     *
     * @param templateId   模板id
     * @param publicAccess 公开状态,true表示公开,false表示取消公开
     * @return 修改结果
     */
    @PostMapping("changePublishStatus")
    public Result changePublishStatus(@RequestParam Integer templateId, @RequestParam Boolean publicAccess) {
        boolean flag = true;
        // 只有在关闭的时候才需要检查有没有其他任务使用
        if (!publicAccess) {
            Integer useNum = templateService.getTemplateOtherUseCount(templateId);// 获得正在使用这个模板的其他任务的数量
            if (useNum > 0) {
                flag = false;
            }
        }

        // 如果正在被其他任务使用则不能设置公开状态为false
        if (flag) {
            boolean success = templateService.changePublishStatus(templateId, publicAccess);
            if (success) {
                return Result.success("发布状态修改成功");
            } else {
                return Result.fail(Result.ERR_CODE_BUSINESS, "发布状态修改失败");
            }
        } else {
            return Result.fail(Result.ERR_CODE_BUSINESS, "该模板已被其他任务使用,无法撤回");
        }
    }


    /**
     * 获取分页数据总数
     *
     * @param pageKind 分页类型:个人模板列表,默认模板列表,领取信息列表
     * @param userId   用户id
     * @return 分页数据总数
     */
    @GetMapping("getPageTotalNum")
    public Result getPageTotalNum(@RequestParam String pageKind, @RequestParam Integer userId) {
        if (!pageKindSet.contains(pageKind)) {
            return Result.fail(Result.ERR_CODE_BUSINESS, "分页参数有误");
        }
        Integer pageTotalNum = templateService.getTotalPageNum(pageKind, userId);
        return Result.success(pageTotalNum);
    }


}
